﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using RegistroMascotas.Modelo;
using System.Configuration;
using Seguridad.Encriptación;

namespace Data
{
    public class PersonaDAO
    {

        #region Atributos
            private static SqlConnection _conn = new SqlConnection(ConfigurationManager.ConnectionStrings["CadenaConn"].ConnectionString);
            private static SqlCommand _comm;
            private static Encriptador _encriptador = new Encriptador(Properties.Resources.PassPhrase, Properties.Resources.SaltValue, Properties.Resources.HashAlgorithm, 1, Properties.Resources.InitVector, 128);
            //private static SqlDataAdapter _adapter;    
        #endregion

        public static bool iniciarSesion (string userName, string userPass){
            bool resultado = false;

            _comm = new SqlCommand();
            _comm.Connection = _conn;
            _comm.CommandType = CommandType.StoredProcedure;

            _comm.CommandText = "sp_Persona_Login"; 

            _comm.Parameters.Add("@nombre",SqlDbType.VarChar,50);
            _comm.Parameters[0].Value = userName;

            _comm.Parameters.Add("@contraseña", SqlDbType.VarChar, 44);
            _comm.Parameters[1].Value = _encriptador.Encriptar(userPass);

            _comm.Parameters.Add("@encontrado", SqlDbType.Bit);
            _comm.Parameters[2].Direction = ParameterDirection.Output;

            try
            {
                _conn.Open();
                _comm.ExecuteNonQuery();
                resultado = Boolean.Parse(_comm.Parameters[2].Value.ToString());               
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally {
                _conn.Close();
            }

            return resultado;
        }

        public static bool comprobarUsuarioRepetido(string userName)
        {
            bool resultado = false;

            _comm = new SqlCommand();
            _comm.Connection = _conn;
            _comm.CommandType = CommandType.StoredProcedure;

            _comm.CommandText = "sp_Personas_ComprobarUsuarioRepetido";

            _comm.Parameters.Add("@nombre", SqlDbType.VarChar, 50);
            _comm.Parameters[0].Value = userName;

            _comm.Parameters.Add("@encontrado", SqlDbType.Bit);
            _comm.Parameters[1].Direction = ParameterDirection.Output;

            try
            {
                _conn.Open();
                _comm.ExecuteNonQuery();
                resultado = Boolean.Parse(_comm.Parameters[1].Value.ToString());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                _conn.Close();
            }

            return resultado;
        }

        public static Object traerDatosUsuario(string userName)
        {
            DataTable dtUsuarios = new DataTable();
            SqlDataAdapter adapter;
            Object resultado = null;

            try
            {
                _comm = new SqlCommand();
                _comm.Connection = _conn;

                _comm.CommandType = CommandType.StoredProcedure;
                _comm.CommandText = "sp_Personas_TraerTodo";

                _comm.Parameters.Add("@nombreUsuario", SqlDbType.VarChar, 50);
                _comm.Parameters[0].Value = userName;

                adapter = new SqlDataAdapter();
                adapter.SelectCommand = _comm;
                adapter.Fill(dtUsuarios);

                foreach (DataRow user in dtUsuarios.Rows)
                {

                    switch (int.Parse(user["IdTipoUsuario"].ToString()))
                    {
                        case 1:
                            Persona admin = new Persona();

                            admin.IdPersona = int.Parse(user["IdPersona"].ToString());
                            admin.Nombre = user["Nombre"].ToString();
                            admin.Usuario = user["Usuario"].ToString();
                            admin.Contraseña = _encriptador.Desencriptar(user["Contraseña"].ToString());
                            admin.Imagen = user["Imagen"].ToString();
                            admin.TipoUsuario = int.Parse(user["IdTipoUsuario"].ToString());
                            admin.Mail = user["Mail"].ToString();
                            resultado = admin;

                            break;
                        case 2:
                            Centro c = new Centro();
                            c.IdPersona = int.Parse(user["IdPersona"].ToString());
                            c.Nombre = user["Nombre"].ToString();
                            c.Direccion = user["Direccion"].ToString();
                            c.Telefono = user["Telefono"].ToString();
                            c.Usuario = user["Usuario"].ToString();
                            c.Contraseña = _encriptador.Desencriptar(user["Contraseña"].ToString());
                            c.Mail = user["Mail"].ToString();
                            c.Localidad = user["Localidad"].ToString();
                            c.Provincia = user["Provincia"].ToString();
                            c.Cuit = long.Parse(user["DniCuitMatricula"].ToString());
                            c.Imagen = user["Imagen"].ToString();
                            c.TipoUsuario = int.Parse(user["IdTipoUsuario"].ToString());

                            resultado = c;
                            break;
                        case 3:
                            Dueño d = new Dueño();
                            d.IdPersona = int.Parse(user["IdPersona"].ToString());
                            d.Nombre = user["Nombre"].ToString();
                            d.Direccion = user["Direccion"].ToString();
                            d.Telefono = user["Telefono"].ToString();
                            d.Usuario = user["Usuario"].ToString();
                            d.Contraseña = _encriptador.Desencriptar(user["Contraseña"].ToString());
                            d.Mail = user["Mail"].ToString();
                            d.Localidad = user["Localidad"].ToString();
                            d.Provincia = user["Provincia"].ToString();
                            d.Dni = long.Parse(user["DniCuitMatricula"].ToString());
                            d.CantDenuncias = int.Parse(user["CantDenuncias"].ToString());
                            d.Imagen = user["Imagen"].ToString();
                            d.TipoUsuario = int.Parse(user["IdTipoUsuario"].ToString());
                            d.Sexo = user["Sexo"].ToString();

                            resultado = d;
                            break;
                        case 4:
                            Veterinario v = new Veterinario();
                            v.IdPersona = int.Parse(user["IdPersona"].ToString());
                            v.Nombre = user["Nombre"].ToString();
                            v.Direccion = user["Direccion"].ToString();
                            v.Telefono = user["Telefono"].ToString();
                            v.Usuario = user["Usuario"].ToString();
                            v.Contraseña = _encriptador.Desencriptar(user["Contraseña"].ToString());
                            v.Mail = user["Mail"].ToString();
                            v.Localidad = user["Localidad"].ToString();
                            v.Provincia = user["Provincia"].ToString();
                            v.Matricula = long.Parse(user["DniCuitMatricula"].ToString());
                            v.Imagen = user["Imagen"].ToString();
                            v.CantDenuncias = int.Parse(user["CantDenuncias"].ToString());
                            v.TipoUsuario = int.Parse(user["IdTipoUsuario"].ToString());
                            v.Sexo = user["Sexo"].ToString();

                            resultado = v;
                            break;
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally {
                _conn.Close();
            }

            return resultado;
        }

        public static string traerTipoUsuarioPorUsuario(string userName)
        {
            DataTable dtUsuarios = new DataTable();
            SqlDataAdapter adapter;
            string resultado = "";

            try
            {
                _comm = new SqlCommand();
                _comm.Connection = _conn;

                _comm.CommandType = CommandType.StoredProcedure;
                _comm.CommandText = "sp_TipoUsuarios_TraerPorUsuario";

                _comm.Parameters.Add("@nombreUsuario", SqlDbType.VarChar, 20);
                _comm.Parameters[0].Value = userName;

                adapter = new SqlDataAdapter();
                adapter.SelectCommand = _comm;
                adapter.Fill(dtUsuarios);

                foreach (DataRow user in dtUsuarios.Rows)
                {
                    resultado = user["TipoUsuario"].ToString();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally {
                _conn.Close();
            }

            return resultado;
        }

        public static List<string> traerTipoUsuarioTodos()
        {
            DataTable dtTiposUsuarios = new DataTable();
            SqlDataAdapter adapter;
            List<string> tiposUsuario= new List<string>();

            try
            {
                _comm = new SqlCommand();
                _comm.Connection = _conn;

                _comm.CommandType = CommandType.StoredProcedure;
                _comm.CommandText = "sp_TipoUsuarios_TraerTodos";
                
                adapter = new SqlDataAdapter();
                adapter.SelectCommand = _comm;
                adapter.Fill(dtTiposUsuarios);

                foreach (DataRow tipos in dtTiposUsuarios.Rows)
                {
                     tiposUsuario.Add(tipos["TipoUsuario"].ToString());
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                _conn.Close();
            }

            return tiposUsuario;
        }

        public static bool registrarCentro(Centro miCentro)
        {
            bool exito = false;

            _comm = new SqlCommand();
            _comm.Connection = _conn;
            _comm.CommandType = CommandType.StoredProcedure;

            _comm.CommandText = "sp_Personas_Alta";

            _comm.Parameters.Add("@nombre", SqlDbType.VarChar, 50);
            _comm.Parameters[0].Value = miCentro.Nombre;

            _comm.Parameters.Add("@direccion", SqlDbType.VarChar, 50);
            _comm.Parameters[1].Value = miCentro.Direccion;

            _comm.Parameters.Add("@telefono", SqlDbType.VarChar, 11);
            _comm.Parameters[2].Value = miCentro.Telefono;

            _comm.Parameters.Add("@usuario", SqlDbType.VarChar, 20);
            _comm.Parameters[3].Value = miCentro.Usuario;

            _comm.Parameters.Add("@contraseña", SqlDbType.VarChar, 44);
            _comm.Parameters[4].Value = _encriptador.Encriptar(miCentro.Contraseña);

            _comm.Parameters.Add("@estado", SqlDbType.VarChar, 10);
            _comm.Parameters[5].Value = miCentro.Estado;

            _comm.Parameters.Add("@mail", SqlDbType.VarChar, 50);
            _comm.Parameters[6].Value = miCentro.Mail;

            _comm.Parameters.Add("@localidad", SqlDbType.VarChar, 30);
            _comm.Parameters[7].Value = miCentro.Localidad;

            _comm.Parameters.Add("@provincia", SqlDbType.VarChar, 30);
            _comm.Parameters[8].Value = miCentro.Provincia;

            _comm.Parameters.Add("@dniCuitMatricula", SqlDbType.Decimal);
            _comm.Parameters[9].Value = miCentro.Cuit;

            _comm.Parameters.Add("@telefono2", SqlDbType.VarChar, 11);
            _comm.Parameters[10].Value = "";

            _comm.Parameters.Add("@cantDenuncias", SqlDbType.Int);
            _comm.Parameters[11].Value = 0;

            _comm.Parameters.Add("@idTipoUsuario", SqlDbType.Int);
            _comm.Parameters[12].Value = miCentro.TipoUsuario;

            _comm.Parameters.Add("@sexo", SqlDbType.VarChar, 9);
            _comm.Parameters[13].Value = "";

            try
            {
                _conn.Open();
                _comm.ExecuteScalar();
                exito = true;
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                _conn.Close();
            }

            return exito;
        }

        public static bool registrarDueño(Dueño miDueño) {
            bool exito = false;

            _comm = new SqlCommand();
            _comm.Connection = _conn;
            _comm.CommandType = CommandType.StoredProcedure;

            _comm.CommandText = "sp_Personas_Alta";

            _comm.Parameters.Add("@nombre", SqlDbType.VarChar, 50);
            _comm.Parameters[0].Value = miDueño.Nombre;

            _comm.Parameters.Add("@direccion", SqlDbType.VarChar, 50);
            _comm.Parameters[1].Value = miDueño.Direccion;

            _comm.Parameters.Add("@telefono", SqlDbType.VarChar, 11);
            _comm.Parameters[2].Value = miDueño.Telefono;

            _comm.Parameters.Add("@usuario", SqlDbType.VarChar, 20);
            _comm.Parameters[3].Value = miDueño.Usuario;

            _comm.Parameters.Add("@contraseña", SqlDbType.VarChar, 44);
            _comm.Parameters[4].Value = _encriptador.Encriptar(miDueño.Contraseña);

            _comm.Parameters.Add("@estado", SqlDbType.VarChar, 10);
            _comm.Parameters[5].Value = miDueño.Estado;

            _comm.Parameters.Add("@mail", SqlDbType.VarChar, 50);
            _comm.Parameters[6].Value = miDueño.Mail;

            _comm.Parameters.Add("@localidad", SqlDbType.VarChar, 30);
            _comm.Parameters[7].Value = miDueño.Localidad;

            _comm.Parameters.Add("@provincia", SqlDbType.VarChar, 30);
            _comm.Parameters[8].Value = miDueño.Provincia;

            _comm.Parameters.Add("@dniCuitMatricula", SqlDbType.Decimal);
            _comm.Parameters[9].Value = miDueño.Dni;

            _comm.Parameters.Add("@telefono2", SqlDbType.VarChar, 11);
            _comm.Parameters[10].Value = miDueño.Celular;

            _comm.Parameters.Add("@cantDenuncias", SqlDbType.Int);
            _comm.Parameters[11].Value = miDueño.CantDenuncias;

            _comm.Parameters.Add("@idTipoUsuario", SqlDbType.Int);
            _comm.Parameters[12].Value = miDueño.TipoUsuario;

            _comm.Parameters.Add("@sexo", SqlDbType.VarChar, 9);
            _comm.Parameters[13].Value = miDueño.Sexo;

            try
            {
                _conn.Open();
                _comm.ExecuteScalar();
                exito = true;
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                _conn.Close();
            }            
            
            return exito;
        }

        public static bool registrarVeterinario(Veterinario miVeterinario)
        {
            bool exito = false;
            
            _comm = new SqlCommand();
            _comm.Connection = _conn;
            _comm.CommandType = CommandType.StoredProcedure;

            _comm.CommandText = "sp_Personas_Alta";

            _comm.Parameters.Add("@nombre", SqlDbType.VarChar, 50);
            _comm.Parameters[0].Value = miVeterinario.Nombre;

            _comm.Parameters.Add("@direccion", SqlDbType.VarChar, 50);
            _comm.Parameters[1].Value = miVeterinario.Direccion;

            _comm.Parameters.Add("@telefono", SqlDbType.VarChar, 11);
            _comm.Parameters[2].Value = miVeterinario.Telefono;

            _comm.Parameters.Add("@usuario", SqlDbType.VarChar, 20);
            _comm.Parameters[3].Value = miVeterinario.Usuario;

            _comm.Parameters.Add("@contraseña", SqlDbType.VarChar, 44);
            _comm.Parameters[4].Value = _encriptador.Encriptar(miVeterinario.Contraseña);

            _comm.Parameters.Add("@estado", SqlDbType.VarChar, 10);
            _comm.Parameters[5].Value = miVeterinario.Estado;

            _comm.Parameters.Add("@mail", SqlDbType.VarChar, 50);
            _comm.Parameters[6].Value = miVeterinario.Mail;

            _comm.Parameters.Add("@localidad", SqlDbType.VarChar, 30);
            _comm.Parameters[7].Value = miVeterinario.Localidad;

            _comm.Parameters.Add("@provincia", SqlDbType.VarChar, 30);
            _comm.Parameters[8].Value = miVeterinario.Provincia;

            _comm.Parameters.Add("@dniCuitMatricula", SqlDbType.Decimal);
            _comm.Parameters[9].Value = miVeterinario.Matricula;

            _comm.Parameters.Add("@telefono2", SqlDbType.VarChar, 11);
            _comm.Parameters[10].Value = miVeterinario.Celular;

            _comm.Parameters.Add("@cantDenuncias", SqlDbType.Int);
            _comm.Parameters[11].Value = miVeterinario.CantDenuncias;

            _comm.Parameters.Add("@idTipoUsuario", SqlDbType.Int);
            _comm.Parameters[12].Value = miVeterinario.TipoUsuario;

            _comm.Parameters.Add("@sexo", SqlDbType.VarChar, 9);
            _comm.Parameters[13].Value = miVeterinario.Sexo;

            try
            {
                _conn.Open();
                _comm.ExecuteScalar();
                exito = true;
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                _conn.Close();
            }

            return exito;
        }

        public static bool modificarVeterinarioDueño(string userName, string telefono, string contraseña, string img,int tipoUser) {
            bool exito = false;

            _comm = new SqlCommand();
            _comm.Connection = _conn;
            _comm.CommandType = CommandType.StoredProcedure;

            _comm.CommandText = "sp_Personas_ModificarVeterinarioDueño";

            _comm.Parameters.Add("@nickName", SqlDbType.VarChar, 20);
            _comm.Parameters[0].Value = userName;

            _comm.Parameters.Add("@telefono", SqlDbType.VarChar, 11);
            _comm.Parameters[1].Value = telefono;

            _comm.Parameters.Add("@contraseña", SqlDbType.VarChar, 44);
            _comm.Parameters[2].Value = _encriptador.Encriptar(contraseña);

            _comm.Parameters.Add("@imagen", SqlDbType.NText);
            _comm.Parameters[3].Value = img;

            _comm.Parameters.Add("@tipoUsuario", SqlDbType.Int);
            _comm.Parameters[4].Value = tipoUser;

            try
            {
                _conn.Open();
                _comm.ExecuteScalar();
                exito = true;
            }
            catch (Exception e)
            {
                throw e;
            }
            finally {
                _conn.Close();
            }

            return exito;
        }

        public static bool modificarAdmin(string nombre, string contraseña, string img)
        {
            bool exito = false;

            _comm = new SqlCommand();
            _comm.Connection = _conn;
            _comm.CommandType = CommandType.StoredProcedure;

            _comm.CommandText = "sp_Personas_ModificarAdmin"; 

            _comm.Parameters.Add("@name", SqlDbType.VarChar, 50);
            _comm.Parameters[0].Value = nombre;
            
            _comm.Parameters.Add("@contraseña", SqlDbType.VarChar, 44);
            _comm.Parameters[1].Value = _encriptador.Encriptar(contraseña);

            _comm.Parameters.Add("@imagen", SqlDbType.NText);
            _comm.Parameters[2].Value = img;

            try
            {
                _conn.Open();
                _comm.ExecuteScalar();
                exito = true;
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                _conn.Close();
            }

            return exito;
        }

        public static bool modificarCentro(string userName, string telefono, string domicilio, string contraseña, string img)
        {
            bool exito = false;

            _comm = new SqlCommand();
            _comm.Connection = _conn;
            _comm.CommandType = CommandType.StoredProcedure;

            _comm.CommandText = "sp_Personas_ModificarCentro";

            _comm.Parameters.Add("@nickName", SqlDbType.VarChar, 20);
            _comm.Parameters[0].Value = userName;

            _comm.Parameters.Add("@domicilio", SqlDbType.VarChar, 50);
            _comm.Parameters[1].Value = domicilio;

            _comm.Parameters.Add("@telefono", SqlDbType.VarChar, 11);
            _comm.Parameters[2].Value = telefono;

            _comm.Parameters.Add("@contraseña", SqlDbType.VarChar, 44);
            _comm.Parameters[3].Value = _encriptador.Encriptar(contraseña);

            _comm.Parameters.Add("@imagen", SqlDbType.NText);
            _comm.Parameters[4].Value = img;

            try
            {
                _conn.Open();
                _comm.ExecuteScalar();
                exito = true;
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                _conn.Close();
            }

            return exito;
        }

        public static bool modificarVeterinarioDueñoPorCentro(Persona p)
        {
            bool exito = false;

            _comm = new SqlCommand();
            _comm.Connection = _conn;
            _comm.CommandType = CommandType.StoredProcedure;

            _comm.CommandText = "sp_Personas_ModificarVeterinarioDueñoPorCentro";
            
            _comm.Parameters.Add("@telefono", SqlDbType.VarChar, 11);
            _comm.Parameters[0].Value = p.Telefono;

            _comm.Parameters.Add("@domicilio", SqlDbType.VarChar, 50);
            _comm.Parameters[1].Value = p.Direccion;
            
            _comm.Parameters.Add("@idPersona", SqlDbType.Int);
            _comm.Parameters[2].Value = p.IdPersona;

            try
            {
                _conn.Open();
                _comm.ExecuteScalar();
                exito = true;
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                _conn.Close();
            }

            return exito;
        }

        public static List<Mascota> obtenerMisMascotas(int idDueño) {
            DataTable dtMascotas = new DataTable();
            SqlDataAdapter adapter;
            List<Mascota> pets = new List<Mascota>();
            Mascota miMascota = null;

            try
            {
                _comm = new SqlCommand();
                _comm.Connection = _conn;

                _comm.CommandType = CommandType.StoredProcedure;
                _comm.CommandText = "sp_Personas_obtenerMascotas";

                _comm.Parameters.Add("@idDueño", SqlDbType.Int);
                _comm.Parameters[0].Value = idDueño;

                adapter = new SqlDataAdapter();
                adapter.SelectCommand = _comm;
                adapter.Fill(dtMascotas);

                foreach (DataRow pet in dtMascotas.Rows)
                {
                    miMascota = new Mascota();

                    miMascota.IdMascota = int.Parse(pet["IdMascota"].ToString());
                    miMascota.Nombre = pet["Nombre"].ToString();
                    miMascota.Apellido = pet["Apellido"].ToString();
                    miMascota.Raza = pet["Raza"].ToString();
                    miMascota.PasoZoonosis = bool.Parse(pet["PasoZoonosis"].ToString());
                    miMascota.NombreZoonosis = pet["NombreZoonosis"].ToString();
                    miMascota.MotivoZoonosis = pet["MotivoZoonosis"].ToString();
                    miMascota.CantVecesPerdido = int.Parse(pet["cantVecesPerdido"].ToString());
                    miMascota.CantSalidasPais = int.Parse(pet["cantSalidasPais"].ToString());
                    miMascota.CantSalidasProv = int.Parse(pet["cantSalidasProv"].ToString());
                    miMascota.Estado = pet["Estado"].ToString();
                    miMascota.IdChapita = int.Parse(pet["IdChapita"].ToString());
                    miMascota.Imagen = pet["Imagen"].ToString();
                    miMascota.Sexo = pet["Sexo"].ToString();

                    pets.Add(miMascota);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                _conn.Close();
            }

            return pets;
        }

        public static List<Centro> obtenerZoonosis() {
            DataTable dtZoonosis = new DataTable();
            SqlDataAdapter adapter;
            Centro zoo = null;
            List<Centro> zoos = new List<Centro>();

            try
            {
                _comm = new SqlCommand();
                _comm.Connection = _conn;
                _comm.CommandType = CommandType.StoredProcedure;
                _comm.CommandText = "sp_Personas_traerZoonosis";

                adapter = new SqlDataAdapter();
                adapter.SelectCommand = _comm;
                adapter.Fill(dtZoonosis);

                foreach (DataRow zoonosis in dtZoonosis.Rows)
                {
                    zoo = new Centro();

                    zoo.IdPersona = int.Parse(zoonosis["IdPersona"].ToString());
                    zoo.Nombre = zoonosis["Nombre"].ToString();
                    zoo.Direccion = zoonosis["Direccion"].ToString();
                    zoo.Telefono = zoonosis["Telefono"].ToString();
                    zoo.Usuario = zoonosis["Usuario"].ToString();
                    zoo.Contraseña = zoonosis["Contraseña"].ToString();
                    zoo.Estado = zoonosis["Estado"].ToString();
                    zoo.Mail = zoonosis["Mail"].ToString();
                    zoo.Localidad = zoonosis["Localidad"].ToString();
                    zoo.Provincia = zoonosis["Provincia"].ToString();
                    zoo.Cuit = int.Parse(zoonosis["DniCuitMatricula"].ToString());
                    zoo.TipoUsuario = int.Parse(zoonosis["IdTipoUsuario"].ToString());
                    zoo.Imagen = zoonosis["Imagen"].ToString();

                    zoos.Add(zoo);
                }

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally {
                _conn.Close();
            }
            return zoos;
        }

        public static Dueño obtenerDueñoPorId(int idDueño) {
            DataTable dtDueños = new DataTable();
            SqlDataAdapter adapter;            
            Dueño miDueño = null;

            try
            {
                _comm = new SqlCommand();
                _comm.Connection = _conn;

                _comm.CommandType = CommandType.StoredProcedure;
                _comm.CommandText = "sp_Personas_ObtenerDueñoPorId";

                _comm.Parameters.Add("@idDueño", SqlDbType.Int);
                _comm.Parameters[0].Value = idDueño;

                adapter = new SqlDataAdapter();
                adapter.SelectCommand = _comm;
                adapter.Fill(dtDueños);

                foreach (DataRow dueñito in dtDueños.Rows)
                {
                    miDueño = new Dueño();

                    miDueño.IdPersona = int.Parse(dueñito["IdPersona"].ToString());
                    miDueño.Nombre = dueñito["Nombre"].ToString();
                    miDueño.Direccion = dueñito["Direccion"].ToString();
                    miDueño.Telefono = dueñito["Telefono"].ToString();
                    miDueño.Usuario = dueñito["Usuario"].ToString();
                    miDueño.Contraseña = dueñito["Contraseña"].ToString();
                    miDueño.Estado = dueñito["Estado"].ToString();
                    miDueño.Mail = dueñito["Mail"].ToString();
                    miDueño.Localidad = dueñito["Localidad"].ToString();
                    miDueño.Provincia = dueñito["Provincia"].ToString();
                    miDueño.Dni = long.Parse(dueñito["DniCuitMatricula"].ToString());
                    miDueño.Celular = dueñito["Telefono2"].ToString();
                    miDueño.CantDenuncias = int.Parse(dueñito["CantDenuncias"].ToString());
                    miDueño.TipoUsuario = int.Parse(dueñito["IdTipoUsuario"].ToString());
                    miDueño.Imagen = dueñito["Imagen"].ToString();
                    miDueño.Sexo = dueñito["Sexo"].ToString();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                _conn.Close();
            }

            return miDueño;
        }        

        /* DENUNCIAS */

        public static bool crearDenuncia(Denuncia d,long dniMatricula) {
            bool exito = false;

            try
            {
                _comm = new SqlCommand();
                _comm.Connection = _conn;
                _comm.CommandType = CommandType.StoredProcedure;
                _comm.CommandText = "sp_Denuncias_Crear";

                _comm.Parameters.Add("@idPersona", SqlDbType.Int);

                if (d.Persona.IdPersona == 0)
                {
                    _comm.Parameters[0].Value = DBNull.Value;
                }
                else {
                    _comm.Parameters[0].Value = d.Persona.IdPersona;
                }

                _comm.Parameters.Add("@motivo", SqlDbType.VarChar, 100);
                _comm.Parameters[1].Value = d.Motivo;

                _comm.Parameters.Add("@facebook", SqlDbType.VarChar, 50);
                _comm.Parameters[2].Value = d.Facebook;

                _comm.Parameters.Add("@estado", SqlDbType.VarChar, 21);
                _comm.Parameters[3].Value = d.Estado;

                _comm.Parameters.Add("@nombre", SqlDbType.VarChar, 30);
                _comm.Parameters[4].Value = d.Persona.Nombre;

                _comm.Parameters.Add("@telefono", SqlDbType.VarChar, 11);
                _comm.Parameters[5].Value = d.Persona.Telefono;

                _comm.Parameters.Add("@localidad", SqlDbType.VarChar, 30);
                _comm.Parameters[6].Value = d.Persona.Localidad;

                _comm.Parameters.Add("@direccion", SqlDbType.VarChar, 50);
                _comm.Parameters[7].Value = d.Persona.Direccion;

                _comm.Parameters.Add("@dniMatricula", SqlDbType.Decimal);
                _comm.Parameters[8].Value = dniMatricula;

                _comm.Parameters.Add("@nombreDenunciante", SqlDbType.VarChar, 50);
                _comm.Parameters[9].Value = d.NombreDenunciante;

                _comm.Parameters.Add("@dniDenunciante", SqlDbType.Decimal);
                _comm.Parameters[10].Value = d.DniDenunciante;
                
                _conn.Open();

                _comm.ExecuteScalar();

                exito = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally {
                _conn.Close();
            }

            return exito;
        }

        public static int obtenerDenunciado(Persona p) {
            int id = 0;
            DataTable dtDenunciado = new DataTable();
            SqlDataAdapter adapter;
            
            try
            {
                _comm = new SqlCommand();
                _comm.Connection = _conn;
                _comm.CommandType = CommandType.StoredProcedure;
                _comm.CommandText = "sp_Denuncias_ObtenerUsuario";

                _comm.Parameters.Add("@nombre", SqlDbType.VarChar, 30);
                _comm.Parameters[0].Value = p.Nombre;

                _comm.Parameters.Add("@telefono", SqlDbType.VarChar, 11);
                _comm.Parameters[1].Value = p.Telefono;

                adapter = new SqlDataAdapter();
                adapter.SelectCommand = _comm;
                adapter.Fill(dtDenunciado);

                foreach (DataRow r in dtDenunciado.Rows) {
                    id = int.Parse(r["IdPersona"].ToString());
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                _conn.Close();
            }

            return id;
        }

        public static List<Denuncia> obtenerDenunciaPorEstado(string estado)
        {
            DataTable dtDenuncias = new DataTable();
            SqlDataAdapter adapter;
            Denuncia d = null;
            List<Denuncia> denuncias = new List<Denuncia>();

            try
            {
                _comm = new SqlCommand();
                _comm.Connection = _conn;
                _comm.CommandType = CommandType.StoredProcedure;
                _comm.CommandText = "sp_Denuncias_ObtenerTodasPorEstado";

                _comm.Parameters.Add("@estado", SqlDbType.VarChar, 21);
                _comm.Parameters[0].Value = estado;

                adapter = new SqlDataAdapter();
                adapter.SelectCommand = _comm;
                adapter.Fill(dtDenuncias);

                foreach (DataRow row in dtDenuncias.Rows)
                {
                    d = new Denuncia();

                    d.IdDenuncia = int.Parse(row["IdDenuncia"].ToString());
                    d.Motivo = row["Motivo"].ToString();
                    d.Facebook = row["Facebook"].ToString();
                    d.Estado = row["Estado"].ToString();
                    d.NombreDenunciante = row["Denunciante"].ToString();
                    d.DniDenunciante = long.Parse(row["DNIDenunciante"].ToString());
                    d.MotivoRechazo = row["MotivoRechazo"].ToString();

                    if (row["IdPersona"].ToString() != "" && row["IdPersona"].ToString() != null)
                    {
                        d.Persona = new Persona();

                        d.Persona.IdPersona = int.Parse(row["IdPersona"].ToString());

                        Persona p = new Persona();

                        p = obtenerDueñoPorId(int.Parse(row["IdPersona"].ToString()));

                        d.Persona.Nombre = p.Nombre;
                        d.Persona.Localidad = p.Localidad;
                        d.Persona.Telefono = p.Telefono;
                        d.Persona.Direccion = p.Direccion;
                    }
                    else 
                    {
                        d.Persona = new Persona();

                        d.Persona.Nombre = row["Nombre"].ToString();

                        if (row["Localidad"].ToString() != "" && row["Localidad"].ToString() != null)
                            d.Persona.Localidad = row["Localidad"].ToString();
                        else
                            d.Persona.Localidad = "";

                        if (row["Telefono"].ToString() != "" && row["Telefono"].ToString() != null)
                            d.Persona.Telefono = row["Telefono"].ToString();    
                        else
                            d.Persona.Telefono = "";

                        if (row["Direccion"].ToString() != "" && row["Direccion"].ToString() != null)
                            d.Persona.Direccion = row["Direccion"].ToString();
                        else
                            d.Persona.Direccion = "";      
                    }                    
                    
                    denuncias.Add(d);
                }

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                _conn.Close();
            }
            return denuncias;
        }

        public static bool cambiarEstadoDenuncia(int idDenuncia, string estado, string causa) {
            bool exito = false;

            try
            {
                _comm = new SqlCommand();
                _comm.Connection = _conn;
                _comm.CommandType = CommandType.StoredProcedure;
                _comm.CommandText = "sp_Denuncias_CambiarEstado";

                _comm.Parameters.Add("@idDenuncia", SqlDbType.Int);
                _comm.Parameters[0].Value = idDenuncia;

                _comm.Parameters.Add("@estado", SqlDbType.VarChar, 21);
                _comm.Parameters[1].Value = estado;

                _comm.Parameters.Add("@causaRechazo", SqlDbType.VarChar, 100);
                _comm.Parameters[2].Value = causa;

                _conn.Open();

                _comm.ExecuteScalar();

                exito = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                _conn.Close();
            }
            return exito;
        }

        public static int obtenerPersonaDeDenuncia(int idDenuncia) {
            int id = 0;
            SqlDataAdapter adapter;
            DataTable dtDenunciado = new DataTable();

            try
            {
                _comm = new SqlCommand();
                _comm.Connection = _conn;
                _comm.CommandType = CommandType.StoredProcedure;
                _comm.CommandText = "sp_Denuncias_ObtenerPersonaDeDenuncia";

                _comm.Parameters.Add("@idDenuncia",SqlDbType.Int);
                _comm.Parameters[0].Value = idDenuncia;

                adapter = new SqlDataAdapter();
                adapter.SelectCommand = _comm;
                adapter.Fill(dtDenunciado);

                foreach (DataRow r in dtDenunciado.Rows)
                {
                    if (r["IdPersona"].ToString() != "")
                        id = int.Parse(r["IdPersona"].ToString());
                }

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                _conn.Close();
            }

            return id;
        }

        public static bool sumarCantDenuncias(int idPersona)
        {
            bool exito = false;

            try
            {
                _comm = new SqlCommand();
                _comm.Connection = _conn;
                _comm.CommandType = CommandType.StoredProcedure;
                _comm.CommandText = "sp_Persona_SumarDenuncias";

                _comm.Parameters.Add("@idPersona", SqlDbType.Int);
                _comm.Parameters[0].Value = idPersona;

                _conn.Open();

                _comm.ExecuteScalar();

                exito = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                _conn.Close();
            }
            return exito;
        }

        public static bool quitarPersonaDenuncia(int idDenuncia)
        {
            bool exito = false;

            try
            {
                _comm = new SqlCommand();
                _comm.Connection = _conn;
                _comm.CommandType = CommandType.StoredProcedure;
                _comm.CommandText = "sp_Denuncias_QuitarPersona";

                _comm.Parameters.Add("@idDenuncia", SqlDbType.Int);
                _comm.Parameters[0].Value = idDenuncia;

                _conn.Open();

                _comm.ExecuteScalar();

                exito = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                _conn.Close();
            }
            return exito;
        }
    }
}
